﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;

namespace CapaDatos.Adapters
{
   public class CicloLectivoAdapter 
    {


        BDRinconLuzEntities contexto;

        public CicloLectivoAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

        public CicloLectivoAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }

      
        public void Agregar(CicloLectivo entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

        public void Eliminar(CicloLectivo entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<CicloLectivo> objectSet = contexto.CrearSet<CicloLectivo>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



        public void Modificar(CicloLectivo entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.SaveChanges();
        }


        public IEnumerable<CicloLectivo> Obtener()
        {
            return contexto.CrearSet<CicloLectivo>();
        }

        public List<CicloLectivo> ObtenerCiclosLectivos()
        {
            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var query = (from v in contexto.CicloLectivo
                         where v.Eliminado != true
                         select v).ToList();

            return query;
        }

        public List<ViewEntity> ObtenerEntidades()
        {
            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var query = (from v in contexto.CicloLectivo
                         where v.Eliminado != true
                         select v).ToList();

            foreach (var item in query)
            {
                ListaFinal.Add(new ViewEntity(item.IdCicloLectivo, item.NombreCicloLectivo));
                
            }

            return ListaFinal;
        }


        public CicloLectivo ObtenerEntidad(int año)
        {

             var ExisteEntidad = (from v in contexto.CicloLectivo
                                  where v.FechaDesde.Value.Year == año &&
                                        v.Eliminado != true
                           select v).Any();

             if (ExisteEntidad == true)
             {
                 var Entidad = (from v in contexto.CicloLectivo
                                where v.FechaDesde.Value.Year == año &&
                                        v.Eliminado != true
                                select v).First();
                 return Entidad;
             }
             else
             {
                 CicloLectivo entidad = null;
                 return entidad;
             }
        }

        public CicloLectivo ObtenerEntidad(Guid id)
        {

            var ExisteEntidad = (from v in contexto.CicloLectivo
                                 where v.IdCicloLectivo == id &&
                                       v.Eliminado != true
                                 select v).Any();

            if (ExisteEntidad == true)
            {
                var Entidad = (from v in contexto.CicloLectivo
                               where v.IdCicloLectivo == id &&
                                       v.Eliminado != true
                               select v).First();
                return Entidad;
            }
            else
            {
                CicloLectivo entidad = null;
                return entidad;
            }
        }

        public bool ExisteEntidadAñoActual()
        {

            var ExisteEntidad = (from v in contexto.CicloLectivo
                                 where v.FechaDesde.Value.Year == DateTime.Now.Year &&
                                       v.Eliminado != true
                                 select v).Any();

            return ExisteEntidad;
        }



        public bool TieneTurnos(Guid idCiclo)
        {

            var ExistenTurnos = (from v in contexto.Turno
                                 where v.IdCicloLectivo == idCiclo &&
                                       v.Eliminado != true
                                 select v).Any();

            if (ExistenTurnos == true)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

       /// <summary>
       /// Valida la existencia de un ciclo lectivo
       /// </summary>
       /// <returns>True si ya existe un ciclo</returns>
        public bool ValidarAño(CicloLectivo entidad)
        {
            Boolean existeCicloLectivo = (from v in contexto.CicloLectivo
                         where v.FechaDesde.Value.Year == entidad.FechaDesde.Value.Year ||
                         v.FechaHasta.Value.Year == entidad.FechaHasta.Value.Year &&
                        v.Eliminado != true
                         select v).Any();

            return existeCicloLectivo;
        }

        public bool ValidarAño(int año)
        {
            Boolean existeCicloLectivo = (from v in contexto.CicloLectivo
                                          where v.FechaDesde.Value.Year == año &&
                                                v.Eliminado != true
                                          select v).Any();

            return existeCicloLectivo;
        }


    }
}
